CoreDataObserver.swift 1.3 KB

12345678910111213141516171819202122232425262728293031323334
  1. import Combine
  2. import CoreData
  3. import Foundation
  4. // The app-wide Core Data change feed now lives on `CoreDataStack.entityChangePublisher`, which is
  5. // sourced from persistent history (and therefore also covers batch operations and cross-process
  6. // changes). This file only keeps the `filteredByEntityName` operator used by its subscribers.
  7. extension Publisher where Output == Set<NSManagedObjectID> {
  8. /// Filters Core Data changes by entity name.
  9. ///
  10. /// Example usage:
  11. /// ```swift
  12. /// // Filter changes for "GlucoseStored" entity
  13. /// CoreDataStack.shared.entityChangePublisher.filteredByEntityName("GlucoseStored")
  14. /// ```
  15. ///
  16. /// - Parameter name: The name of the Core Data entity to filter for
  17. /// - Returns: A publisher emitting filtered sets of NSManagedObjectIDs
  18. func filteredByEntityName(
  19. _ name: String
  20. ) -> some Publisher<Set<NSManagedObjectID>, Self.Failure> {
  21. compactMap { objectIDs -> Set<NSManagedObjectID>? in
  22. // Early exit for empty sets
  23. guard !objectIDs.isEmpty else { return nil }
  24. // Use lazy evaluation for better performance
  25. let filtered = objectIDs.lazy.filter { $0.entity.name == name }
  26. let result = Set(filtered)
  27. return result.isEmpty ? nil : result
  28. }
  29. }
  30. }